Codex — OpenAI 终端 AI 编程 Agent
Codex CLI 是 OpenAI 开发的轻量级 AI 编程 Agent(Coding Agent), 在本机终端(Terminal)中运行。它能理解自然语言指令、检查代码、修改文件、执行命令, 在不离开终端的情况下完成软件工程任务。 GitHub 105K+ Stars,开源协议 Apache-2.0,当前版本 v0.143.0。
| 仓库 | github.com/openai/codex |
|---|---|
| 官方文档 | developers.openai.com/codex |
| 许可证 | Apache-2.0 |
| 技术栈 | Rust(core + CLI)、TypeScript(前端/SDK) |
| 安装方式 | curl 安装脚本 / npm / Homebrew / GitHub Releases 二进制 |
| 模型 | GPT-5.6 系列(Sol / Terra / Luna),支持 API Key 自定义模型 |
1. 概述
Codex CLI 的核心是一个 ReAct(Reasoning + Acting)循环: 模型在"思考(生成计划)→ 行动(调用工具)→ 观察(获得结果)"之间反复, 直到完成用户交给的任务。它运行在 Harness(缰绳/驾驭)框架内—— 所有模型行为都被工具白名单、权限审批、沙箱隔离、会话状态持久化等工程约束包裹, 保证 Agent 的行为可预测、可控、可审计、可终止。
1.1 定位与产品形态
Codex 是 OpenAI 的 AI Coding Agent 产品矩阵中的一员,其产品形态覆盖多个表面(Surface):
| 形态 | 说明 | 与 Codex CLI 的关系 |
|---|---|---|
| Codex CLI | 本机终端运行的开源 Agent,本文档主体 | 本机执行,支持交互式 TUI 与非交互式 exec |
| Codex 桌面应用 | macOS/Windows 桌面 App(codex app 唤起) |
同一 Codex host,共享 config.toml 与 MCP 配置 |
| Codex IDE 扩展 | VS Code / Cursor / Windsurf 插件 | 共享同一 Codex host 的配置层 |
| Codex Web / Cloud | 云端 Agent(chatgpt.com/codex) | 云端环境执行,codex apply 把云端 diff 应用到本地 |
| Codex SDK / MCP Server | 把 Codex 嵌入自己的应用或被其它 Agent 消费 | codex app-server / codex mcp-server |
1.2 核心特性
- 终端内完整循环 — 交互式 TUI(
codex)中探索代码、改文件、跑命令,一次会话持续跟进 - 非交互自动化 —
codex exec无界面运行,输出 JSONL,可接入脚本与 CI - 本地代码审查 —
codex review对未提交改动 / 分支 diff / 提交做独立审查,不改动工作区 - 多 Agent 协作 — subagents 把复杂任务拆分给专用子代理并行执行
- 沙箱与审批 — macOS Seatbelt / Linux Landlock / Windows Sandbox 平台原生隔离 + 细粒度审批策略
- MCP 扩展 — 连接第三方工具(浏览器、Figma、GitHub、Sentry 等)
- 指令体系 — AGENTS.md 全局 + 项目分层指令,支持 override 与 fallback 文件名
- 多种认证 — ChatGPT 订阅(Plus/Pro/Biz/Edu/Ent)、API Key、Access Token
- 图像输入 —
--image把报错截图、架构图、设计稿加入 Prompt - Web 搜索 — 默认 cached 模式,
--search切换实时联网
1.3 专有名词解释
| 名词 | 解释 |
|---|---|
| Agent / Coding Agent(编程代理) | 能自主理解任务、调用工具、执行多步操作并完成任务的智能体,区别于单轮问答的 Chatbot |
| Harness(缰绳/驾驭)工程 | 把模型自由输出约束到安全可控可审计框架里的工程实践,Codex 本身就是 harness 的一个实现 |
| ReAct 循环 | Reasoning + Acting 交替循环:思考→行动→观察,直到任务完成或达到终止条件 |
| TUI(终端 UI) | Text User Interface,终端里的全屏交互界面,Codex 交互模式的主界面 |
| Sandbox(沙箱) | Agent 执行命令时被限制的运行边界,定义可访问的文件与网络资源 |
| Approval Policy(审批策略) | 决定 Agent 何时必须停下来征求人类批准(untrusted / on-request / never) |
| MCP(Model Context Protocol) | 模型上下文协议,把外部工具/数据接入 Agent 的标准协议,支持 STDIO 与 Streamable HTTP |
| AGENTS.md | 给 Agent 看的项目指令文件,Codex 每次启动前读取,用于注入项目规范与工作约定 |
| Subagent(子代理) | 主 Agent 派生的专用子代理,用于拆分复杂任务并行工作,结果回到主会话 |
| JSONL(JSON Lines) | 每行一个 JSON 对象的数据流格式,codex exec --json 输出的事件流格式 |
| Writable Root(可写根目录) | 沙箱中允许 Agent 修改的目录集合,默认是工作区 |
| Checkpoint(检查点) | 任务前后用 Git commit 建立的可回退点,Codex 官方推荐的安全实践 |
1.4 平台化转向澄清(2026-08-19)
核实结论(基于仓库 git 历史与官方文档,2026-08-21): 这次是"从可读到受支持"的转变,不是"从闭源到开源"——媒体所称 "底层 Rust 核心 codex-rs 此前属于内部实现、未完整开源"并不属实。
早已公开的部分(git 历史佐证)
| 时间 | 已在 openai/codex 公开的内容 |
|---|---|
| 2025-04 | Codex CLI 首次开源(Apache-2.0),codex-rs core 全部可读 |
| 2025-09-29 | TypeScript SDK 脚手架入库(PR #4455) |
| 2025-09-30 | codex-rs/app-server 从 mcp-server 拆分独立成 crate(PR #4471) |
| 2026-07-29 | Codex Security CLI + TS SDK 开源(openai/codex-security) |
8-19 前后的实质性变动
| 变动 | 性质 | 说明 |
|---|---|---|
| app-server JSON-RPC 2.0 客户端协议正式发布文档 | 文档化 | /codex/app-server,线程/回合/事件流/审批接口成文 |
| Codex SDK 升级为官方组件并新增 Python SDK | 接口产品化 | 此前仅 TS 脚手架;/codex/codex-sdk |
| 开源组件清单页 | 边界声明 | /codex/open-source:明确哪些开源、哪些不开源 |
| "Codex as a platform" 战略定位 | 宣示 | 鼓励把 agent 循环嵌入自家产品(运维看板、工单系统等),而非塞进通用聊天框;配套示例应用 Relay |
| ARC-AGI-3 数据博客 | 宣传背书 | 仅两项 harness 设置(保留推理 + 上下文压缩)使 GPT-5.6 Sol 得分 13.3% → 38.3%,输出 token 减少约 6 倍 |
明确不开源的部分
- IDE 扩展(VS Code / Cursor / Windsurf 插件)
- Codex cloud(云端托管环境,仅基础镜像 codex-universal 开源)
- 模型访问与托管服务(走 ChatGPT 订阅 / API)
对本章的影响:本文源码级分析基于 commit 722784e936,结论不受此次公告影响;
6.2 节中标注 Experimental 的 app-server / remote-control / cloud
现已获官方文档背书,但成熟度标记维持不变(官方仍称 experimental)。
2. 行为分析(做什么)
2.1 用例图 — 用户与 Codex 的交互全景
展示四类参与者(开发人员、DevOps、管理员、外部系统)与 Codex 的能力边界。
用例说明:Codex 的用例可分为"任务执行类"(改代码、修 bug、审查)、 "环境配置类"(登录、配置、权限)、"自动化类"(exec、review、MCP、CI)与"生命周期类"(resume/fork/archive)。
2.2 活动图 — 交互式会话主流程
展示一次 codex 交互式会话从启动到结束的完整活动链,含斜杠命令分支与 Web 搜索分支。
关键行为:用户在项目目录启动 codex,首次运行先走登录流程。
会话中可通过斜杠命令切换模型(/model)、查看状态(/status)、
调整权限(/permissions)、执行审查(/review)或创建 AGENTS.md(/init)。
2.3 序列图 — 一次 Agent 回合的完整链路
从用户提交 Prompt 到模型调用工具、观察结果、给出最终答复的端到端序列,展示沙箱与审批在链路中的位置。
链路要点:模型生成的工具调用命令不会直接执行——先经 ExecPolicy 规则(allow/prompt/block)判断,再进沙箱(限制文件系统与网络), 若需越界则触发审批(on-request 策略下弹给用户或自动审查代理)。 工具结果回填对话上下文,模型继续推理,直到完成或达到终止条件。
2.4 活动图 — 权限与沙箱决策流
Codex 对"模型生成的每条命令"执行的决策链:规则判断 → 沙箱边界 → 审批策略。
决策逻辑:
- 规则层(execpolicy .rules) — 前缀匹配:
allow直接放行、prompt触发审批、block直接拒绝 - 沙箱层(sandbox_mode) —
read-only只读;workspace-write工作区内可写;danger-full-access无限制 - 审批层(approval_policy) —
untrusted非信任命令必问;on-request越界才问;never不问
3. 结构分析(由什么组成)
3.1 部署图 — 运行时拓扑
Codex CLI 部署在开发者本机,通过网络与 OpenAI 后端交互,并可通过 app-server 支撑远程/桌面客户端。
部署要点:
- Codex 二进制运行在开发机(macOS/Linux/Windows/WSL2),沙箱用平台原生机制
- 认证后(ChatGPT OAuth 或 API Key)通过 HTTPS 与 OpenAI 后端通信,本地无自有模型推理
--oss模式可选本地 OSS 模型提供商(LM Studio / Ollama)codex app-server --listen ws://IP:PORT可把本机 Codex 能力暴露给远程 TUI / 桌面客户端(--remote连接)- MCP 服务器作为子进程(STDIO)或远程 HTTP 端点接入
3.2 组件图 — 模块组成
Codex 仓库的模块划分(monorepo):core(核心循环)、CLI、SDK、MCP Server、app-server。
| 组件 | 职责 |
|---|---|
| codex-rs core | Agent 核心:ReAct 循环、工具定义、会话管理、指令(AGENTS.md)组装、模型调用 |
| codex-rs cli | 命令行前端:TUI 渲染、参数解析、子命令分发(exec/review/resume 等) |
| execpolicy / sandbox | 命令执行决策:规则匹配、沙箱实施(Seatbelt/Landlock/Windows)、网络代理 |
| MCP 客户端 | 管理 STDIO / Streamable HTTP MCP 服务器,把外部工具暴露给模型 |
| app-server | 把 Codex 暴露为 WebSocket/Unix Socket 服务,支撑远程客户端与桌面应用 |
| mcp-server | 把 Codex 自身作为 MCP server(stdio),供其它 Agent 消费 |
| sdk(TypeScript) | 编程接口封装,用于构建自定义前端 |
3.3 概念类图 — 领域模型
Codex 领域核心实体及其关系:Session(会话)、Turn(回合)、Item(消息/事件项)、Tool(工具)、AgentConfig(配置)。
领域模型要点:
- Session(会话) — 一次持续交互的容器,含多轮 Turn;可存档/恢复/分支(resume/fork/archive)
- Turn(回合) — 一次用户输入驱动的模型处理周期,含多条 Item
- Item(项) — 会话中可持久化的单元:Agent 消息、推理、命令执行、文件改动、MCP 调用、Web 搜索、计划更新
- Tool(工具) — shell、文件读写、Web 搜索、MCP 工具等,均有 JSON Schema 与审批模式
- SandboxPolicy / ApprovalPolicy — 分别定义技术边界与"何时暂停"
- AGENTS.md 指令链 — 全局→项目根→当前目录逐层合并,作为 System Prompt 的一部分
4. 配置体系
4.1 配置层级与优先级
Codex 配置以 TOML 存储,多个来源按优先级合并(高→低):
- CLI flags 与
-c key=value覆盖(最高) - 项目配置
.codex/config.toml(从项目根到当前目录,最近的优先;仅受信任项目加载) - Profile 文件
--profile name(~/.codex/name.config.toml) - 用户配置
~/.codex/config.toml - 系统配置
/etc/codex/config.toml(Unix) - 内置默认值
.codex/ 层(config、hooks、rules)只在受信任项目加载。
项目配置不能覆盖 provider/auth/notify/profile/telemetry 等机器级密钥类配置。
管理员可用 requirements.toml 强制约束(如禁止 approval_policy = "never")。
4.2 常用配置键(~/.codex/config.toml)
# 默认模型
model = "gpt-5.6"
# 审批策略:untrusted | on-request | never
approval_policy = "on-request"
# 沙箱级别:read-only | workspace-write | danger-full-access
sandbox_mode = "workspace-write"
# Web 搜索:cached(默认)| indexed | live | disabled
web_search = "cached"
# 推理力度
model_reasoning_effort = "high"
# 沟通风格
personality = "friendly" # friendly | pragmatic | none
# 日志目录(显式设置会额外启用明文 TUI 日志 codex-tui.log)
log_dir = "/absolute/path/to/codex-logs"
# Windows 原生沙箱
[windows]
sandbox = "elevated"
# 终端快捷键
[tui.keymap.global]
open_transcript = "ctrl-t"
# 命令环境变量过滤
[shell_environment_policy]
ignore_default_excludes = false
[shell_environment_policy.filters]
"PATH" = "include"
"HOME" = "include"
常用 feature flags([features] 表):
| Key | 默认 | 说明 |
|---|---|---|
multi_agent | true | 子代理协作工具(spawn_agent / send_input 等) |
hooks | true | 生命周期钩子(hooks.json 或 [hooks]) |
goals | true | 持久化目标与自动续跑 |
memories | false | 记忆功能(实验性) |
shell_tool | true | 默认 shell 工具 |
unified_exec | true(Windows 除外) | 统一 PTY 执行工具 |
network_proxy | false | 沙箱化网络代理(实验性) |
shell_snapshot | true | 快照 shell 环境加速重复命令 |
启用方式:codex --enable feature_name,或在 [features] 下写 name = true。
4.3 AGENTS.md 指令体系
Codex 每次启动(每个会话)都会构建一条指令链注入 System Prompt。发现顺序:
- 全局层:
~/.codex/AGENTS.override.md(若存在)→ 否则~/.codex/AGENTS.md - 项目层:从项目根(通常 Git root)向下到当前目录,每层检查
AGENTS.override.md→AGENTS.md→ 兜底文件名 - 合并:从根向下拼接(空行分隔),越靠近当前目录越靠后、优先级越高
其它配置项:project_doc_fallback_filenames(自定义兜底文件名列表)、
project_doc_max_bytes(合并上限,默认 32 KiB,超限停止追加)、
CODEX_HOME(自定义 Codex 主目录)。
# 自定义兜底文件名与更大容量
project_doc_fallback_filenames = ["TEAM_GUIDE.md", ".agents.md"]
project_doc_max_bytes = 65536
## Code Review Rules 章节,
Codex 的 GitHub 代码审查会读取该章节规则来审查 PR/改动(详见官方 GitHub 集成文档)。
4.4 MCP 扩展
MCP(Model Context Protocol)把外部工具与数据接入 Codex。支持 STDIO 服务器(本地子进程)与
Streamable HTTP 服务器(远程地址 + Bearer/OAuth 认证)。配置存于 ~/.codex/config.toml。
CLI 方式添加 MCP 服务器
# 添加 STDIO 服务器(Context7 开发者文档)
codex mcp add context7 -- npx -y @upstash/context7-mcp
# 列出 / 登录 / 移除
codex mcp list
codex mcp login <server-name> # 仅 Streamable HTTP 且支持 OAuth
codex mcp remove <server-name>
config.toml 方式(精细控制)
[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"]
env_vars = ["LOCAL_TOKEN"]
[mcp_servers.context7.env]
MY_ENV_VAR = "MY_ENV_VALUE"
[mcp_servers.figma]
url = "https://mcp.figma.com/mcp"
bearer_token_env_var = "FIGMA_OAUTH_TOKEN"
http_headers = { "X-Figma-Region" = "us-east-1" }
[mcp_servers.chrome_devtools]
url = "http://localhost:3000/mcp"
enabled_tools = ["open", "screenshot"]
default_tools_approval_mode = "prompt"
startup_timeout_sec = 20
tool_timeout_sec = 45
[mcp_servers.chrome_devtools.tools.open]
approval_mode = "approve"
常用 MCP 服务器:OpenAI Docs MCP、Context7、Figma、Playwright、Chrome DevTools、Sentry、GitHub。
5. 实战演示操作手册
5.1 安装与登录
安装(macOS / Linux)
curl -fsSL https://chatgpt.com/codex/install.sh | sh
或包管理器:
npm install -g @openai/codex
brew install --cask codex
登录(首次运行)
codex # 选择 "Sign in with ChatGPT"(Plus/Pro/Biz/Edu/Ent 订阅可用)
# API Key 方式
printenv OPENAI_API_KEY | codex login --with-api-key
# Access Token 方式(CI)
printenv CODEX_ACCESS_TOKEN | codex login --with-access-token
# 无浏览器环境
codex login --device-auth
# 验证登录
codex login status # 已登录时退出码为 0
5.2 交互式会话实战
启动并探索项目
cd ~/my-project
codex # 启动 TUI,默认 gpt-5.6-sol medium
# 直接给出首条指令
codex "Tell me about this project"
# 带截图/架构图启动
codex --image error-screenshot.png "debug this crash"
会话中常用斜杠命令
/model # 切换模型与推理力度
/status # 查看当前会话配置
/permissions# 打开权限选择器(含沙箱与可写根)
/init # 创建 AGENTS.md 指令文件
/review # 审查当前改动
/mcp # 查看已连接的 MCP 服务器
低摩擦本地开发启动方式
codex --sandbox workspace-write --ask-for-approval on-request
推荐实践:任务开始前建立 Git checkpoint(commit),任务后再次 commit,保证可回退。
会话管理
codex resume # 恢复最近会话
codex resume <session-id> # 按 ID 恢复
codex fork <session-id> # 从历史会话分支出新会话
codex archive <session-id> # 归档
codex delete <session-id> # 删除
codex completion zsh > "${fpath[1]}/_codex" # 补全脚本
5.3 非交互模式 codex exec
基本用法
# 一次性任务,最终消息输出到 stdout,进度在 stderr
codex exec "summarize the repository structure and list the top 5 risky areas"
# 生成发布说明并落盘
codex exec "generate release notes for the last 10 commits" | tee release-notes.md
# 不持久化会话文件
codex exec --ephemeral "triage this repository and suggest next steps"
管道输入(stdin)
# prompt + stdin(stdin 作为附加上下文)
npm test 2>&1 | codex exec "summarize the failing tests and propose the smallest likely fix"
# stdin 即完整 prompt(- 哨兵强制)
cat prompt.txt | codex exec -
# 动态组装 prompt
generate_prompt.sh | codex exec - --json > result.jsonl
机器可读输出
# JSONL 事件流(thread.started / turn.started / turn.completed / item.* / error)
codex exec --json "summarize the repo structure" | jq
# 只保存最终消息到文件(同时仍打印 stdout)
codex exec "Extract project metadata" --output-schema ./schema.json -o ./project-metadata.json
自动化安全设置
# 允许工作区内编辑
codex exec --sandbox workspace-write "<task>"
# 只读默认(read-only);危险场景才用 danger-full-access
codex exec "<task>"
# 忽略用户配置 / 忽略 rules 文件(受控环境)
codex exec --ignore-user-config --ignore-rules "<task>"
# 非 Git 目录运行(默认要求 Git 仓库以防破坏)
codex exec --skip-git-repo-check "<task>"
恢复非交互会话
codex exec "review the change for race conditions"
codex exec resume --last "fix the race conditions you found"
codex exec resume <SESSION_ID>
认证注入(CI 单次运行)
CODEX_API_KEY=<api-key> codex exec --json "triage open bug reports"
OPENAI_API_KEY / CODEX_API_KEY 设为 Job 级环境变量——
同 Job 内不可信的构建脚本 / 依赖钩子 / 被攻陷的 action 都能读到。只对单次 codex exec 调用内联注入。
5.4 codex review 代码审查
# 审查未提交改动(staged + unstaged + untracked)
codex review --uncommitted
# 对比基线分支(PR 风格)
codex review --base main
# 审查某次提交
codex review --commit <SHA>
# 自定义审查指令
codex review "focus on the auth refactor, flag security issues"
--uncommitted、--base、--commit 与自定义 PROMPT 互斥;--title 仅配合 --commit。
审查不会修改工作区,只输出按优先级排序的问题。
5.5 CI 自动化实战
GitHub Actions:CI 失败自动修复(核心模式)
# 1. 主 CI 失败时触发 follow-up workflow
# 2. 以只读权限 checkout 失败 commit
# 3. 用 openai/codex-action 跑 Codex(保护 API key)
# 4. 把改动序列化为 patch artifact
# 5. 独立 job 应用 patch 并开 PR(该 job 无 API key 权限)
name: Codex auto-fix on CI failure
on:
workflow_run:
workflows: ["CI"]
types: [completed]
jobs:
generate_fix:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v5
with:
ref: ${{ github.event.workflow_run.head_sha }}
fetch-depth: 0
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install dependencies
run: |
if [ -f package-lock.json ]; then npm ci; fi
- name: Run Codex
uses: openai/codex-action@v1
with:
openai-api-key: ${{ secrets.OPENAI_API_KEY }}
prompt: |
The CI workflow "${{ github.event.workflow_run.name }}" failed for
commit ${{ github.event.workflow_run.head_sha }}. Run `npm test --silent`
to reproduce. Implement only the minimal fix, run tests again. Do not
refactor unrelated files.
- name: Create patch artifact
id: diff
run: |
git add -N .
git diff --binary HEAD > codex.patch
if [ -s codex.patch ]; then echo "has_patch=true" >> "$GITHUB_OUTPUT"; else echo "has_patch=false" >> "$GITHUB_OUTPUT"; fi
- name: Upload patch artifact
if: steps.diff.outputs.has_patch == 'true'
uses: actions/upload-artifact@v4
with:
name: codex-fix-patch
path: codex.patch
if-no-files-found: error
open_pr:
needs: generate_fix
if: needs.generate_fix.outputs.has_patch == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v5
with:
ref: ${{ github.event.workflow_run.head_sha }}
fetch-depth: 0
- uses: actions/download-artifact@v4
with:
name: codex-fix-patch
- name: Apply Codex patch
run: git apply --index codex.patch
- name: Open pull request
env:
GH_TOKEN: ${{ github.token }}
RUN_ID: ${{ github.event.workflow_run.run_id }}
run: |
branch="codex/auto-fix-$RUN_ID"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git switch -c "$branch"
git commit -m "Auto-fix failing CI via Codex"
git push origin "$branch"
gh pr create --base "${{ github.event.workflow_run.head_branch }}" \
--head "$branch" --title "Auto-fix failing CI via Codex" \
--body-file pr-body.md
完整安全清单参见 codex-action 安全文档。
6. 参数指令速查手册
6.1 全局 flags(适用于 codex / exec / resume 等)
| Flag | 类型/取值 | 说明 |
|---|---|---|
--add-dir | path | 额外授予工作区之外的目录写权限(可重复) |
--ask-for-approval, -a | untrusted / on-request / never | 控制何时暂停等人批准 |
--cd, -C | path | 设置工作目录 |
--config, -c | key=value | 覆盖配置值(可重复) |
--dangerously-bypass-approvals-and-sandbox, --yolo | boolean | 完全跳过审批与沙箱(仅限加固环境) |
--dangerously-bypass-hook-trust | boolean | 不要求 hook 持久化信任(仅自动化) |
--enable / --disable | feature | 强制启用/禁用 feature flag(可重复) |
--image, -i | path[,path...] | 把图片附加到初始 prompt(可重复/逗号分隔) |
--local-provider | lmstudio / ollama | 配合 --oss 指定本地模型提供商 |
--model, -m | string | 覆盖模型(如 gpt-5.6-terra) |
--no-alt-screen | boolean | 关闭 TUI 备用屏幕 |
--oss | boolean | 使用本地开源模型提供商 |
--profile, -p | string | 叠加 $CODEX_HOME/profile-name.config.toml |
--remote | ws:// / wss:// / unix:// | 连接远程 app-server 端点 |
--remote-auth-token-env | ENV_VAR | 从环境变量读取 bearer token 发送给 --remote |
--sandbox, -s | read-only / workspace-write / danger-full-access | 模型生成 shell 命令的沙箱策略 |
--search | boolean | 启用实时 Web 搜索(web_search="live") |
--strict-config | boolean | 遇到不认识的 config 字段即报错 |
6.2 子命令速查
| 命令 | 成熟度 | 说明 |
|---|---|---|
codex | Stable | 启动交互式终端 UI(TUI) |
codex app | Stable | 启动 ChatGPT 桌面应用 |
codex app-server | Experimental | 启动 app server(stdio/WebSocket/Unix socket) |
codex apply(别名 codex a) | Stable | 把 Codex cloud 聊天生成的最新 diff 应用到本地 |
codex archive / unarchive | Stable | 归档 / 恢复会话 |
codex cloud | Experimental | 终端浏览/执行云聊天(别名 cloud-tasks) |
codex completion | Stable | 生成 Bash/Zsh/Fish/PowerShell/elvish 补全 |
codex debug models | Experimental | 打印原始模型目录 |
codex debug prompt-input | Experimental | 渲染模型可见的 prompt 输入列表为 JSON |
codex delete | Stable | 永久删除会话 |
codex doctor | Stable | 生成本地诊断报告(安装/配置/认证/运行/Git/终端) |
codex exec(别名 codex e) | Stable | 非交互式运行 |
codex execpolicy | Experimental | 评估 execpolicy 规则文件,判断命令被 allow/prompt/block |
codex features | Stable | 列出 feature flags 并可持久化启用/禁用 |
codex fork | Stable | 从历史会话分支出新会话 |
codex login / logout | Stable | 认证(OAuth/device/API key/access token)/ 退出 |
codex mcp | Stable | 管理 MCP 服务器(add/list/remove/login/logout/get) |
codex mcp-server | Stable | 把 Codex 自身作为 MCP server(stdio) |
codex plugin | Stable | 从 marketplace 安装/列出/移除插件 |
codex plugin marketplace | Stable | 管理插件市场(Git/本地源) |
codex remote-control | Experimental | 管理本地 app-server 的远程控制 |
codex resume | Stable | 恢复历史会话 |
codex review | Stable | 非交互代码审查 |
codex sandbox | Stable | 在 Codex 沙箱内运行任意命令 |
codex update | Stable | 检查并应用 CLI 更新 |
6.3 codex exec 全部 flags
| Flag | 说明 |
|---|---|
--cd, -C | 设置工作区根目录 |
--color | stdout ANSI 颜色(always/never/auto) |
--dangerously-bypass-approvals-and-sandbox, --yolo | 跳过审批与沙箱(仅隔离运行器) |
--dangerously-bypass-hook-trust | 跳过 hook 信任检查 |
--ephemeral | 不持久化会话 rollout 文件 |
--full-auto | 已废弃兼容 flag(建议 --sandbox workspace-write) |
--ignore-rules | 不加载用户/项目 execpolicy .rules |
--ignore-user-config | 不加载 $CODEX_HOME/config.toml(认证仍用 CODEX_HOME) |
--image, -i | 首条消息附加图片 |
--json, --experimental-json | 输出换行分隔 JSON 事件流 |
--local-provider | 配合 --oss 指定本地提供商 |
--model, -m | 覆盖模型 |
--oss | 使用本地 OSS 提供商 |
--output-last-message, -o | 把最终消息写入文件 |
--output-schema | JSON Schema 文件,约束最终响应结构 |
--profile, -p | 叠加 profile 配置 |
--sandbox, -s | 沙箱策略(read-only/workspace-write/danger-full-access) |
--skip-git-repo-check | 允许在非 Git 目录运行 |
-c, --config | 内联配置覆盖(可重复) |
PROMPT | 初始指令;- 表示从 stdin 读取 |
exec resume | --last 恢复最近会话;--all 跨目录搜索;SESSION_ID 指定会话 |
6.4 斜杠命令速查(交互式 TUI 内)
| 命令 | 说明 |
|---|---|
/init | 创建 AGENTS.md 指令文件 |
/status | 查看当前会话配置 |
/permissions | 打开权限选择器(沙箱 + 可写根 + 审批) |
/model | 切换模型与推理力度 |
/review | 审查当前改动并发现问题 |
/mcp | 查看已连接的 MCP 服务器 |
/feedback | 提交反馈 |
/goal | 设置持久化目标 |
/plan | 进入计划模式 |
? | 快捷键帮助 |
6.5 沙箱与审批模式速查
| 沙箱模式 | 行为 |
|---|---|
read-only | 可读文件、审查代码;改文件与跑命令需审批 |
workspace-write | 工作区内读写 + 运行常规命令(默认低摩擦模式) |
danger-full-access | 无沙箱限制(仅受控环境) |
| 审批策略 | 行为 |
|---|---|
untrusted | 非信任命令一律先询问 |
on-request | 沙箱内默认执行,越界才询问 |
never | 从不暂停审批 |
审批审查者:approvals_reviewer = "user"(默认,弹给用户)或
"auto_review"(交给审查子代理自动审)。
平台沙箱实现:macOS Seatbelt(开箱即用);Linux/WSL2 用 bubblewrap(sudo apt install bubblewrap);
Windows 用原生 Windows Sandbox(PowerShell)或 Linux 沙箱(WSL2)。
权限 Profile:内置 :read-only、:workspace、:danger-full-access;
自定义用 [permissions.<name>] 表 + default_permissions。
codex sandbox --permission-profile <NAME> -- <command> 可在沙箱中手动跑命令。
6.6 模型速查
| 模型 | 定位 | 适用场景 |
|---|---|---|
| gpt-5.6-sol(旗舰) | 最强能力 | 复杂编码、计算机使用、研究、网络安全 |
| gpt-5.6-terra(均衡) | 日常主力 | 强推理 + 工具使用,成本更低 |
| gpt-5.6-luna(轻快) | 低成本 | 明确/重复任务:抽取、分类、转换、结构化摘要 |
| gpt-5.3-codex-spark | 近实时迭代 | 文本模型,Pro 用户,极速编码迭代(仅桌面/CLI/IDE) |
| gpt-5.5 / gpt-5.4 / gpt-5.4-mini | 前代模型 | gpt-5.4 系列 2026-08-31 从 ChatGPT 登录的 Codex 退役 |
推理力度:Low/Medium/High/Extra High(CLI 里 /model 调)。
Max = 单一任务更多思考时间;Ultra = 用 subagents 并行拆分复杂任务。
切换:codex --model gpt-5.6 或 codex exec -m gpt-5.6 "..."。
7. Agent System Prompt 梳理(源码级)
repos/codex 仓库源码(commit 722784e936)深挖 Codex 的提示词设计。
与 OpenCode 的"每模型一个 .txt 文件 + 代码层循环"不同,Codex 采用
模型目录(model catalog)驱动 + WorldState 模块化上下文 + 统一 ReAct 循环的三层设计。
下面先讲总览,再逐层细化。
7.1 三层架构总览
Codex 的最终请求体由三层内容拼装而成,分别承担"你是谁"、"当前环境如何"、"会话历史是什么":
| 层 | 内容 | 来源 | 关键机制 |
|---|---|---|---|
| L1 基础指令 Base Instructions |
身份 + 人格 + 通用工作规则 + 破坏性操作安全 + 技能使用 | 模型目录的 instructions_template(远程下发,本地 models.json 兜底) |
按模型动态切换;人格通过 {{ personality }} 占位符烘焙 |
| L2 WorldState 上下文 上下文碎片 |
环境(cwd/日期/时区/网络/文件系统)、权限与沙箱、AGENTS.md、多 Agent 模式、Token 预算、插件/技能指令 | 核心 world_state.rs 的多个 WorldStateSection 实现 |
每个 section 有稳定 ID + 快照,只对"变化的部分"发 diff,缓存友好 |
| L3 会话历史 Messages |
用户消息、助手消息(含工具调用)、工具结果、模型切换提示 | ContextManager 增量维护的历史 items | 规范化后发送;超限触发自动压缩(compaction) |
角色分工:Responses API 中基础指令放在 instructions 字段(或 responses-lite 模式下作为前缀 developer 消息),
WorldState 与历史以 developer / user 角色的 ResponseItem 流式注入,保持增量可缓存。
7.2 基础指令(instructions_template)
与 OpenCode 在代码里硬编码各模型 .txt 不同,Codex 的 System Prompt 主体由
模型目录(model catalog)下发——每个模型在目录里声明自己的
model_messages.instructions_template。本地 models-manager/models.json 是
兜底目录(离线可用),真实运行时会从 OpenAI 拉取最新目录并缓存。
模型目录中的 instructions_template 长度对比
| 模型 | instructions_template 长度 | personality 变量 | 首行身份声明 |
|---|---|---|---|
| gpt-5.6-sol / terra / luna | 17,730 字符 | default/friendly/pragmatic | "You are Codex, an agent based on GPT-5..." |
| gpt-5.5 | 19,754 字符 | default/friendly/pragmatic | "You are Codex, a coding agent based on GPT-5..." |
| gpt-5.4 | 12,896 字符 | default/friendly/pragmatic | "You are Codex, a coding agent based on GPT-5..." |
| gpt-5.4-mini | 11,114 字符 | default/friendly/pragmatic | 同上 |
| gpt-5.2 | 21,544 字符 | default/friendly/pragmatic | "You are GPT-5.2 running in the Codex CLI..." |
| codex-auto-review | 12,896 字符 | default/friendly/pragmatic | 同 gpt-5.4 |
解析逻辑(protocol/src/openai_models.rs:487-505 ModelInfo::get_model_instructions):
若 instructions_variables 存在,则把模板中的 {{ personality }} 占位符
替换为当前人格消息(friendly/pragmatic/默认);若模板无占位符则视为纯文本直接返回。
gpt-5.6-sol 基础指令的章节结构(原文节选)
| 章节 | 核心内容(原文摘录) |
|---|---|
| # Personality | "As Codex, you are an excellent communicator with a curious, rich personality. You match the tone and understanding of the user..." 含 Writing style(Avoid over-formatting...)与 Technical communication(Lead with the outcome rather than the steps...) |
| # Working with the user | 双通道:commentary(边做边播报,60 秒内必须有更新)+ final(结束回合才发)。明确"上下文被压缩时不要重启,继续自然推进"的会话语义。 |
| ### Intermediate commentary | "These messages should be concise and quickly scannable... start with a message in the commentary channel." 禁止把阻塞性澄清问题放进 commentary,必须在 final 里自包含。 |
| ### Final answer / Formatting rules | 允许 GFM Markdown;本地文件引用格式 [app.py](/abs/path/app.py:12);禁止 file:// vscode:// 等 URI;禁止范围行号。 |
| ### Visualizations | 只在"能让关系更易理解"时用可视化;优先最小有用形式(表格/流程/树/线框)。 |
| # Rules for getting work done | 优先 rg;优先并行工具调用;禁止用 echo "===="; 拼接命令;文件编辑:用 apply_patch,禁止 cat/echo 写文件;脏工作区不还原用户改动。 |
| # Destructive Actions | 禁止 rm -rf $HOME 等;删除前必须确认目标;优先可恢复操作(移到回收站)。 |
| # Using skills | SKILL.md 发现规则、触发规则、渐进式披露、上下文卫生(不读无关引用)。 |
本地兜底与旧模型模板
本地兜底 models-manager/prompt.md(也是 gpt-5.2-codex 的 fallback)是最详尽的一版,
含 # AGENTS.md spec(作用域/优先级/嵌套覆盖)、## Responsiveness(preamble 消息规范与示例)、
## Planning(update_plan 高质量/低质量计划示例)、## Task execution
("keep going until the query is completely resolved")、## Ambition vs. precision、
# Tool Guidelines(apply_patch 完整文法)。这正是模型能力尚弱时需要"喂更多规则"的体现——
模板越长 = 模型越弱,GPT-5.6 靠更强的原生能力压缩了提示词篇幅。
7.3 WorldState 模块化上下文系统
WorldState(core/src/context/world_state/mod.rs)是 Codex 的核心提示词机制:
把动态上下文拆成多个独立的 WorldStateSection,每个 section 负责渲染一段"模型可见状态"。
它实现了 AGENTS.md 里要求的全部上下文工程约束:
无历史重写、避免缓存失效、所有注入有界、单条 ≤10K token、所有碎片实现统一 trait。
section 清单(build_world_state_for_step 顺序)
| ID | 类型 | 渲染内容 | 角色 |
|---|---|---|---|
model | ModelInstructionsState | 模型切换时注入 <model_switch> 基础指令 | developer |
personality | PersonalityState | 人格变更时注入 PersonalitySpecInstructions | developer |
token_budget | TokenBudgetContext | 上下文窗口 ID 与预算提醒 | developer |
realtime | RealtimeState | 实时语音模式的开始/结束指令 | developer |
agents_md | AgentsMdState | AGENTS.md 指令(含替换/移除通知) | user |
permissions | PermissionsState | 沙箱模式 + 审批策略 + execpolicy 规则 + 已批准前缀 | developer |
collaboration_mode | CollaborationModeState | Default / Plan 协作模式指令 | developer |
environments | EnvironmentsState | <environment_context>:cwd、日期、时区、网络、文件系统 | user |
environments_instructions | EnvironmentsInstructionsState | 远程执行器(deferred executor)说明 | developer |
apps_instructions | AppsInstructionsState | Apps 连接器使用说明 | developer |
plugins_instructions | PluginsInstructionsState | 插件使用说明 | developer |
multi_agent_mode | MultiAgentModeState | <multi_agent_mode>:主动/仅显式请求委派 | developer |
multi_agent_usage_hint | MultiAgentUsageHintState | 子代理使用提示 | developer |
tools | ToolsState | 延迟加载的工具命名空间说明 | developer |
diff 渲染机制
每个 section 的 snapshot() 产出结构化快照,render_diff(previous) 只输出
相对上次变化的部分。持久化到 rollout 的快照经 RFC 7386 merge-patch 计算差异;
模型可见的碎片用 SHA-1 哈希(WorldStateHash)去重。效果:
- 首回合(Absent→Current):所有 section 全量渲染
- 稳态回合(Known→Current):未变化的 section 返回
None,不重复注入 → 大幅降低 token 与缓存 miss - 历史保留:通过 marker(如
<environment_context>)在历史中识别已注入碎片,支持 Unknown 状态回退
7.4 请求组装流程
从用户输入到 Responses API 请求体的完整链路(core/src/session/turn.rs + core/src/client.rs):
组装要点:
run_turn每次采样前:capture_step_context捕获环境/工具/MCP →record_step_world_state_if_changed计算 WorldState diff →clone_history().for_prompt()规范化历史build_responses_api_request(client.rs:850-944)决定请求形态:- responses-lite 模式(gpt-5.6 系列
use_responses_lite=true):基础指令作为前缀developer消息 +AdditionalTools注入 input 头部,instructions字段留空 - 普通模式:基础指令放
instructions字段,工具放tools字段
- responses-lite 模式(gpt-5.6 系列
- 请求参数:
tool_choice: "auto"、parallel_tool_calls(按模型能力)、reasoning(effort + summary)、stream: true、include: ["reasoning.encrypted_content"] - 非 OpenAI 提供商:剥离加密参数与内部 metadata
7.5 ReAct 循环与终止条件(run_turn)
Codex 的循环不是靠 Prompt 措辞驱动(对比 OpenCode 的 beast.txt"必须循环到底"),
而是纯代码层 while 循环(core/src/session/turn.rs:282-569 run_turn)。
循环条件由 end_turn 标志与 token 预算共同决定:
循环终止判定(run_turn 内):
| 条件 | 行为 |
|---|---|
模型响应 end_turn=false | needs_follow_up=true → 继续下一轮采样 |
模型响应 end_turn=true | 跑 stop hooks(可要求 continuation 或强制停止)→ break |
| 上下文到达 token 上限 | should_roll_over=true → 自动压缩(compaction)后 continue |
| 用户排队新输入 | has_pending_input=true → 继续处理新输入 |
| TurnAborted 错误 | 直接返回 Err,终止回合 |
| InvalidImageRequest | 提示用户移除图片后 break |
| 其它错误 | 发错误事件,break 让用户继续会话 |
关键点:Codex 通过 ResponseEvent::Completed{ end_turn } 判断是否继续——
工具调用被模型"发出"后,若后端判定需要 follow-up 则循环继续;这与
"模型自主决定何时结束"的 OpenCode 模型不同,Codex 把循环控制权交给响应事件,更可控。
7.6 工具 schema 速查
工具集在 core/src/tools/spec_plan.rs:891 add_core_tool_sources 组装,按 feature flags 动态增减:
| 类别 | 工具 | 说明 |
|---|---|---|
| Shell | exec_command |
PTY 执行命令;参数:cmd / workdir / tty / yield_time_ms / max_output_tokens / shell / login / environment_id |
write_stdin | 向运行中的 exec session 写入 stdin | |
shell_command(Hidden) | 旧版 shell 工具,unified exec 模式下对模型隐藏 | |
| 编辑 | apply_patch |
用 begin/end patch 文法编辑文件(add/update/delete + Move to + hunk) |
| 规划 | update_plan |
维护步骤计划(pending/in_progress/completed) |
new_context_window / get_context_remaining | Token 预算管理(TokenBudget feature) | |
| 多 Agent v2 | spawn_agent |
派生子代理(可指定 agent_type / model / reasoning) |
send_message | 向已派生子代理发消息 | |
followup_task | 给子代理下发后续任务 | |
wait_agent | 等待子代理结果 | |
interrupt_agent / list_agents | 中断 / 列出子代理 | |
| MCP 资源 | list_mcp_resources |
列出 MCP 资源(有服务器时注册) |
list_mcp_resource_templates | 列出资源模板 | |
read_mcp_resource | 读取资源 | |
| 其它 | current_time / sleep | 时间查询 / 定时(CurrentTimeReminder feature) |
request_permissions | 请求越权(RequestPermissionsTool feature) | |
request_user_input | 请求用户输入(实验性) | |
view_image / test_sync / web_search / tool_search | 看图 / 测试同步 / 托管搜索工具(按 feature/model 能力) |
guardian 特例:审查者子代理(guardian reviewer)只拿到
exec_command / write_stdin / view_image,通用工具全部排除
(spec_plan.rs:894-922)。
7.7 AGENTS.md 注入机制
AGENTS.md 作为 user 角色碎片注入,带 marker # AGENTS.md instructions /
</INSTRUCTIONS>(context/user_instructions.rs):
# AGENTS.md instructions for {directory}
<INSTRUCTIONS>
{AGENTS.md 合并文本}
注入逻辑(world_state/agents_md.rs):
- 首次注入:直接渲染合并文本
- 替换:前置 "These AGENTS.md instructions replace all previously provided AGENTS.md instructions."
- 移除:注入 "The previously provided AGENTS.md instructions no longer apply."
加载优先级见 4.3 节(全局 override → 项目根向下逐层,越近越优先)。
合并上限 project_doc_max_bytes 默认 32 KiB;达到后停止追加,避免无限膨胀。
7.8 权限与沙箱指令注入
PermissionsInstructions(prompts/src/permissions_instructions.rs)把
沙箱模式、审批策略、execpolicy 规则组装成一段 developer 指令。模板均为 .md 文件,支持 {{ network_access }} 占位符:
# workspace-write 沙箱注入文本
Filesystem sandboxing defines which files can be read or written. `sandbox_mode` is
`workspace-write`: The sandbox permits reading files, and editing files in `cwd` and
`writable_roots`. Editing files in other directories requires approval. Network access
is {{ network_access }}.
on-request 审批策略注入要点(approval_policy/on_request.md):
- 命令按 shell 控制运算符(
|、&&、;、$())切成段逐段评估 - 需越权时用
sandbox_permissions="require_escalated"+justification参数请求审批 prefix_rule建议被禁止宽泛(如python3)、禁止用于破坏性命令(rm)与 heredoc
execpolicy .rules 文件格式(Starlark 语法):
# 允许 git status(含 match 单元测试)
prefix_rule(
pattern = ["git", "status"],
decision = "allow",
justification = "git status is read-only",
match = [["git", "status"], "git status"],
not_match = [["git", "reset"]],
)
# 阻断并给替代建议
prefix_rule(pattern = ["git", "merge"], decision = "forbidden",
justification = "Use rebase instead.")
决策:allow / prompt / forbidden,多规则命中取最严(forbidden > prompt > allow)。
7.9 Personality 人格系统
人格不是单独一段指令,而是烘焙进基础指令模板:模板含 {{ personality }} 占位符,
ModelInstructionsVariables 提供 default / friendly / pragmatic 三套人格文本
(models-manager/src/model_info.rs):
| 人格 | 本地模板文本 |
|---|---|
| friendly | "You optimize for team morale and being a supportive teammate as much as code quality." + Values(Empathy/Collaboration/Ownership)+ Tone 规范 |
| pragmatic | "You are a deeply pragmatic, effective software engineer." |
| default | 模板自带的 "As Codex, you are an excellent communicator..." 段落 |
处理细节(model_info.rs with_config_overrides):personality 禁用时把占位符替换为 default 并清除变量;
personality=None 时用 strip_personality_section 删除整个 # Personality 章节。
7.10 Compaction 与 Review 专用 Prompt
上下文压缩(compaction)
上下文超限时,Codex 用专门的压缩提示词让模型产出交接摘要(prompts/templates/compact/prompt.md):
You are performing a CONTEXT CHECKPOINT COMPACTION. Create a handoff summary for
another LLM that will resume the task.
Include:
- Current progress and key decisions made
- Important context, constraints, or user preferences
- What remains to be done (clear next steps)
- Any critical data, examples, or references needed to continue
Be concise, structured, and focused on helping the next LLM seamlessly continue the work.
压缩后基础指令(instructions)会被保留为 developer 消息,保证"换脑不换身"。
代码审查(review rubric)
codex review 使用独立系统提示词 prompts/templates/review/rubric.md,核心规则:
- 按 8 条通用判定标准识别 bug(影响正确性/性能/安全/可维护性、离散可行动、非既有 bug、作者会修等)
- 评论规范:一段以内、代码片段 ≤3 行、客观语气、不奉承
- 优先级 P0-P3 标签 + JSON 输出 priority 字段(0/1/2/3)
- 每条 finding 附仓库规则(AGENTS.md)引用;结束输出整体正确性裁决
7.11 实战 Case 演示:一次完整会话的请求体组装
下面用一个虚构但完全符合源码逻辑的场景,走一遍从"用户输入"到"Responses API 请求体"的完整组装, 再对比首回合(全量注入)与稳态回合(仅 diff)的差异,直观理解 WorldState 的 token 节省效果。
场景设定
| 项 | 取值 |
|---|---|
| 项目 | ~/my-app(Git 仓库,含 AGENTS.md) |
| 模型 | gpt-5.6-sol(responses-lite 模式) |
| 沙箱 / 审批 | workspace-write / on-request(approvals_reviewer=user) |
| 人格 | friendly |
| 环境 | macOS zsh,cwd=/Users/brian/my-app,日期 2026-08-11,时区 Asia/Shanghai |
| 用户指令 | "看一下项目结构,然后帮我把 README 补全" |
Case 1 — 首回合请求体(全量注入)
build_responses_api_request(client.rs:850)在 responses-lite 模式下:
input 数组头部 = AdditionalTools(developer)→ base_instructions(developer)→
WorldState 各 section(developer/user)→ 最终用户消息。请求体示意(为可读性做了裁剪,真实内容更长):
POST /v1/responses (Responses API, stream=true)
{
"model": "gpt-5.6-sol",
"instructions": "", // responses-lite 模式置空
"input": [
// ── L1 基础指令(作为前缀 developer 消息)──
{
"role": "developer",
"content": [{
"type": "input_text",
"text": "You are Codex, an agent based on GPT-5. You and the user share one
workspace... # Personality(烘焙 friendly) ... # Working with the user
... # Rules for getting work done ... # Destructive Actions
... # Using skills" // 约 17.7K 字符
}]
},
// ── L2 WorldState:模型切换 → 空(首回合无 previous_model)──
// ── L2 WorldState:人格 → 已烘焙进基础指令,不重复注入 ──
// ── L2 WorldState:权限与沙箱(developer)──
{
"role": "developer",
"content": [{
"type": "input_text",
"text": "Filesystem sandboxing defines which files can be read or written.
`sandbox_mode` is `workspace-write`: The sandbox permits reading
files, and editing files in `cwd` and `writable_roots`. Editing
files in other directories requires approval. Network access is
allowed for configured domains.\n\n# Escalation Requests\n
Commands are run outside the sandbox if they are approved...\n\n
## How to request escalation\nIMPORTANT: To request approval...
`sandbox_permissions` with `\"require_escalated\"`..."
}]
},
// ── L2 WorldState:协作模式(developer)──
{
"role": "developer",
"content": [{
"type": "input_text",
"text": "... "
}]
},
// ── L2 WorldState:环境上下文(user,XML 结构)──
{
"role": "user",
"content": [{
"type": "input_text",
"text": "\n /Users/brian/my-app \n
zsh \n 2026-08-11 \n
Asia/Shanghai \n
/Users/brian/my-app
...
\n "
}]
},
// ── L2 WorldState:AGENTS.md(user)──
{
"role": "user",
"content": [{
"type": "input_text",
"text": "# AGENTS.md instructions for /Users/brian/my-app\n\n
\n- 修改 JS 后必须跑 npm test\n- 用 pnpm 安装依赖\n
- 新增生产依赖前先确认\n"
}]
},
// ── L3 用户消息 ──
{
"role": "user",
"content": [{
"type": "input_text",
"text": "看一下项目结构,然后帮我把 README 补全"
}]
}
],
"tool_choice": "auto",
"parallel_tool_calls": false,
"reasoning": { "effort": "medium" },
"stream": true,
"include": ["reasoning.encrypted_content"]
}
注意:AdditionalTools(exec_command / write_stdin / apply_patch / update_plan /
spawn_agent 等工具 schema)作为独立 developer item 放在 input 最前,此处省略。
工具定义走 tool_choice=auto,由模型按需调用。
Case 2 — 一次工具调用回合(模型 → 沙箱 → 审批)
模型收到首回合请求后,推理出需要先探索项目结构,发出工具调用:
// 模型输出的 FunctionCall item
{
"type": "function_call",
"call_id": "call_ab12",
"name": "exec_command",
"arguments": {
"cmd": "ls -la && cat package.json",
"workdir": "/Users/brian/my-app"
}
}
Codex 收到该调用后,走 execpolicy → 沙箱 → 审批 决策链(见 2.4 节活动图):
| 步骤 | 判定 | 结果 |
|---|---|---|
| execpolicy 规则 | ls / cat 无匹配规则 → 无决策 | 落入沙箱边界检查 |
| 沙箱边界 | workspace-write:工作区内只读命令 | 自动执行(无需审批) |
| 命令执行 | PTY 运行 ls -la && cat package.json | 返回目录列表 + package.json 内容 |
| 结果回填 | 工具输出作为 function_call_output 追加到历史 | 进入下一轮采样 |
若模型尝试 越界写(如 npm install 需要写 node_modules 之外或下载依赖触发网络规则),
沙箱会拒绝并要求 require_escalated,此时触发审批(on-request)弹给用户:
// 模型感知需越权,重发请求
{
"type": "function_call",
"call_id": "call_cd34",
"name": "exec_command",
"arguments": {
"cmd": "npm install",
"sandbox_permissions": "require_escalated",
"justification": "需要安装项目依赖(下载 npm 包),允许吗?",
"prefix_rule": ["npm", "install"] // 可选,用户批准后可持久化
}
}
sandbox_permissions=require_escalated 来请求授权——沙箱边界与审批策略的约束写死在
L2 权限指令里,模型据此自我约束,harness 再兜底校验。
Case 3 — 稳态回合:WorldState 只发 diff
用户追问一句"顺便告诉我 node 版本要求",此时进入第 2 个采样请求。WorldState 的
render_diff 对比持久化快照,未变化的 section 返回 None 不重复注入:
| section | 首回合 | 稳态回合 |
|---|---|---|
permissions | 全量注入 | 快照相同 → 不注入 |
environments | 全量注入 | cwd/日期/网络未变 → 不注入 |
agents_md | 全量注入 | 内容未变 → 不注入 |
multi_agent_mode | 注入(默认仅显式请求) | 未变 → 不注入 |
| 会话历史 | 仅首条用户消息 | 追加:工具调用 + 结果 + 新用户消息 |
稳态请求体示意:
{
"model": "gpt-5.6-sol",
"instructions": "",
"input": [
// L1 基础指令在历史中已存在(responses-lite 前缀,由缓存命中)
// 不重复注入
{
"role": "user",
"content": [{ "type": "input_text",
"text": "ls 结果 + package.json 内容(上一轮工具输出)" }]
},
{
"role": "assistant",
"content": [{ "type": "output_text",
"text": "项目结构已看完,根目录有 src/、tests/、package.json。接下来补全 README。" }]
},
{
"role": "user",
"content": [{ "type": "input_text", "text": "顺便告诉我 node 版本要求" }]
}
]
}
效果:稳态回合不再重复注入 ~17.7K 字符的基础指令 + 权限/环境/AGENTS.md 等 WorldState 碎片,
只发送新增的历史消息。配合 Responses API 的 prompt caching(缓存键见 prompt_cache_key),
重复前缀直接命中缓存,token 成本大幅下降。
Case 4 — 上下文超限自动压缩(compaction)
当历史 + 前缀接近模型上下文窗口(gpt-5.6-sol 为 272K,auto-compact 默认取 90% ≈ 244.8K),
run_turn 触发 run_auto_compact:
- 把压缩提示词(7.10 节的
compact/prompt.md)发给模型,让它产出交接摘要 - 基础指令(L1)作为 developer 前缀保留;WorldState 用
replace_compacted_history重建 - 历史被替换为:压缩摘要 + 最近未压缩消息,模型在提示词中被明确告知"你在一次压缩后的会话中,不要重启"
// 压缩后首条历史消息
{
"role": "developer",
"content": [{ "type": "input_text",
"text": "## 项目结构 ##\n- src/ (入口 main.ts, 路由 /api)\n
## 已完成 ##\n- 浏览了项目结构,确认使用 Node 18+\n
## 下一步 ##\n- 补全 README(引用实际命令与结构)\n
## 关键约束 ##\n- AGENTS.md: 改 JS 后跑 npm test" }]
}
压缩后模型继续处理,提示词明确"上下文被自动压缩过,不要从头开始,继续未完成工作"。
require_escalated 主动申请越权,harness 兜底;③稳态回合 WorldState diff 让重复前缀只算一次;
④上下文超限时 compaction 换摘要保前缀。四个 Case 合起来就是 Codex 提示词工程在生产环境的完整生命周期。
end_turn 而非提示词措辞控制。这套设计与 OpenCode 的
"本地 .txt 模板 + Prompt 措辞强度驱动 ReAct"形成鲜明对比,代表两种 Harness 工程路线。